package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.BaseTradeProcessDO;
import com.ssy.lingxi.order.entity.OrderTradeProcessDO;
import com.ssy.lingxi.order.model.vo.process.request.OrderTradeProcessProductVO;
import com.ssy.lingxi.order.model.vo.process.response.OrderTradeProcessProductQueryVO;

import java.util.List;

/**
 * 交易流程关联的商品相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-25
 */
public interface IBaseOrderTradeProcessProductService {
    /**
     * 校验交易流程类型与商品价格类型的配置关系
     * @param baseTradeProcess 基础的交易流程
     * @param includeAllProducts 是否包含所有商品
     * @param productList  商品列表
     * @return 校验结果
     */
    Wrapper<Void> checkTradeProcessProducts(BaseTradeProcessDO baseTradeProcess, Boolean includeAllProducts, List<OrderTradeProcessProductVO> productList);

    /**
     * 校验交易流程关联的商品
     * @param tradeProcesses 已经存在的同类型的交易规则配置
     * @param includeAllProducts 是否包含所有商品
     * @param productList  商品列表
     * @return 校验结果
     */
    Wrapper<Void> checkProducts(List<OrderTradeProcessDO> tradeProcesses, Boolean includeAllProducts, List<OrderTradeProcessProductVO> productList);


    /**
     * 保存交易流程关联的商品，调用方要保存OrderTradeProcessDO
     * @param tradeProcess 交易流程配置
     * @param includeAllProducts 是否包含所有商品
     * @param productList  商品列表
     */
    void saveProducts(OrderTradeProcessDO tradeProcess, Boolean includeAllProducts, List<OrderTradeProcessProductVO> productList);

    /**
     * 分页查询交易流程关联的商品列表
     * @param tradeProcess 交易流程规则
     * @param name         商品名称
     * @param current      当前页
     * @param pageSize     每页行数
     * @return 查询结果
     */
    Wrapper<PageData<OrderTradeProcessProductQueryVO>> pageProducts(OrderTradeProcessDO tradeProcess, String name, int current, int pageSize);

    /**
     * 更新交易流程关联的商品，调用方要保存OrderTradeProcessDO
     * @param tradeProcess 交易流程配置
     * @param includeAllProducts 是否包含所有商品
     * @param productList  商品列表
     */
    void updateProducts(OrderTradeProcessDO tradeProcess, Boolean includeAllProducts, List<OrderTradeProcessProductVO> productList);
}
